package api

import (
	"gomain/app/model"
	"gomain/app/service"
	"gomain/app/utils"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

type UserApi struct{}

func (a *UserApi) Login(r *ghttp.Request) {
	username := r.Get("username").String()
	password := r.Get("password").String()

	user, err := service.User.Login(username, password)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 设置session
	r.Session.Set("user", user)

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "登录成功",
	})
}

// 为用户分配角色
func (a *UserApi) AssignRoles(r *ghttp.Request) {
	var req struct {
		UserId  int   `v:"required#用户ID不能为空"`
		RoleIds []int `v:"required#角色ID不能为空"`
	}

	if err := r.Parse(&req); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	if err := service.Role.AssignRoles(req.UserId, req.RoleIds); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
	})
}

// 获取用户列表
func (a *UserApi) List(r *ghttp.Request) {
	page := r.Get("page", 1).Int()
	limit := r.Get("limit", 10).Int()

	// 获取查询参数
	username := r.Get("username").String()

	m := g.DB().Model("users")

	// 添加查询条件
	if username != "" {
		m = m.Where("username like ?", "%"+username+"%")
	}

	// 获取总数
	count, err := m.Count()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 获取列表数据
	var users []model.User
	err = m.Page(page, limit).Order("id desc").Scan(&users)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code":  0,
		"msg":   "success",
		"count": count,
		"data":  users,
	})
}

// Add 新增用户
func (a *UserApi) Add(r *ghttp.Request) {
	var user model.User
	if err := r.Parse(&user); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 验证必填字段
	if user.Username == "" {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "用户名不能为空",
		})
		return
	}

	// 设置默认密码
	defaultPassword := "123456"
	if user.Password == "" {
		user.Password = defaultPassword
	}

	// 检查用户名是否已存在
	count, err := g.DB().Model("users").Where("username", user.Username).Count()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}
	if count > 0 {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "用户名已存在",
		})
		return
	}

	// 密码加密
	hashedPassword, err := utils.EncryptPassword(defaultPassword)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 构建插入数据
	data := g.Map{
		"username": user.Username,
		"password": hashedPassword,
		"nickname": user.Nickname,
		"status":   user.Status,
	}

	// 插入数据
	_, err = g.DB().Model("users").Data(data).Insert()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "添加成功",
	})
}

// Update 更新用户
func (a *UserApi) Update(r *ghttp.Request) {
	var user model.User
	if err := r.Parse(&user); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 检查用户名是否已存在(排除自己)
	count, err := g.DB().Model("users").
		Where("username", user.Username).
		Where("id != ?", user.Id).
		Count()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}
	if count > 0 {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "用户名已存在",
		})
		return
	}

	// 构建更新数据
	data := g.Map{
		"username": user.Username,
		"nickname": user.Nickname,
		"status":   user.Status,
	}

	// 如果密码不为空，则更新密码
	if user.Password != "" {
		hashedPassword, err := utils.EncryptPassword(user.Password)
		if err != nil {
			r.Response.WriteJson(g.Map{
				"code": 1,
				"msg":  err.Error(),
			})
			return
		}
		data["password"] = hashedPassword
	}

	// 更新数据
	_, err = g.DB().Model("users").
		Where("id", user.Id).
		Data(data).
		Update()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "更新成功",
	})
}

// Get 获取用户信息
func (a *UserApi) Get(r *ghttp.Request) {
	id := r.Get("id").Int()
	var user *model.User
	err := g.DB().Model("users").Where("id", id).Scan(&user)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
		"data": user,
	})
}

// GetProfile 获取用户基本资料
func (a *UserApi) GetProfile(r *ghttp.Request) {
	userId := r.GetCtxVar("user_id").Int()
	var user *model.User
	err := g.DB().Model("users").Where("id", userId).Scan(&user)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
		"data": user,
	})
}

// UpdateProfile 更新用户基本资料
func (a *UserApi) UpdateProfile(r *ghttp.Request) {
	var req struct {
		Nickname string `json:"nickname"`
		Password string `json:"password"`
	}
	if err := r.Parse(&req); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	userId := r.GetCtxVar("user_id").Int()
	data := g.Map{
		"nickname": req.Nickname,
	}
	if req.Password != "" {
		hashedPassword, err := utils.EncryptPassword(req.Password)
		if err != nil {
			r.Response.WriteJson(g.Map{
				"code": 1,
				"msg":  err.Error(),
			})
			return
		}
		data["password"] = hashedPassword
	}

	_, err := g.DB().Model("users").Where("id", userId).Data(data).Update()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "更新成功",
	})
}
